import os
import shutil
import time
import argparse

class FileProcessor:
    def __init__(self, source_dir, target_dir):
        """
        初始化文件处理器
        :param source_dir: 源目录，从中查找文件
        :param target_dir: 目标目录，用于拷贝文件
        """
        self.log_tag='==FileProcessor=='
        print(self.log_tag,'init param:',source_dir,' param2:',target_dir)
        self.source_dir = source_dir
        self.target_dir = target_dir
        
        # 从源目录路径中提取184.168.29.103和AnySelectedNew
        self.ip_part, self.folder_part = self.extract_path_parts(source_dir)
        
        # 确保目标目录存在，如果不存在则创建
        if not os.path.exists(target_dir):
            os.makedirs(target_dir)
            print(f"创建目标目录: {target_dir}")
    def extract_path_parts(self, source_dir):
        """
        从源目录路径中提取184.168.29.103和AnySelectedNew部分
        :param source_dir: 源目录路径
        :return: 包含两个部分的元组 (ip_part, folder_part)
        """
        # 分割路径为组件
        path_parts = os.path.normpath(source_dir).split(os.sep)
        
        # 查找IP地址部分的索引（假设是类似184.168.29.103的格式）
        ip_index = -1
        for i, part in enumerate(path_parts):
            # 简单的IP地址格式检查
            if len(part.split('.')) == 4 and all(part.split('.')[j].isdigit() for j in range(4)):
                ip_index = i
                break
        
        if ip_index == -1 or ip_index + 1 >= len(path_parts):
            raise ValueError("无法从源目录路径中提取所需的部分，请检查源目录路径是否正确")
        
        return path_parts[ip_index], path_parts[ip_index + 1]

    def find_files_with_string(self, search_str):
        """
        查找源目录下包含指定字符串的所有文件
        :param search_str: 要查找的字符串
        :return: 包含指定字符串的文件路径列表
        """
        matched_files = []
        
        # 遍历源目录下的所有文件
        for root, dirs, files in os.walk(self.source_dir):
            for file in files:
                file_path = os.path.join(root, file)
                
                # 只处理文件，跳过目录
                if os.path.isfile(file_path):
                    try:
                        # 尝试以文本模式打开文件查找字符串
                            if search_str in file_path:
                                matched_files.append(file_path)
                                print(f"找到匹配文件: {file_path}")
                    except UnicodeDecodeError:
                        # 处理二进制文件或无法解码的文件
                        print(f"跳过非文本文件: {file_path}")
                    except Exception as e:
                        print(f"处理文件 {file_path} 时出错: {str(e)}")
        
        return matched_files

    def copy_files(self, file_list):
        """
        将文件列表中的文件拷贝到目标目录，并按照指定格式重命名
        新文件名格式: 184.168.29.103_AnySelectedNew_原来的文件名
        :param file_list: 要拷贝的文件路径列表
        :return: 拷贝成功的文件路径列表
        """
        copied_files = []
        
        for file_path in file_list:
            try:
                # 获取原文件名
                original_file_name = os.path.basename(file_path)
                
                # 构建新文件名
                timestamp_sec = int(time.time())
                new_file_name = f"{self.folder_part}_{timestamp_sec}_{original_file_name}"
                target_path = os.path.join(self.target_dir, new_file_name)
                
                # 拷贝文件
                shutil.copy2(file_path, target_path)  # copy2 会保留文件元数据
                copied_files.append(target_path)
                print(f"已拷贝文件: {file_path} -> {target_path}")
            except Exception as e:
                print(f"拷贝文件 {file_path} 失败: {str(e)}")
        
        return copied_files

    def get_line_count(self, file_path):
        """
        获取文件的行数
        :param file_path: 文件路径
        :return: 行数，如果出错则返回0
        """
        try:
            with open(file_path, 'r', encoding='utf-8') as f:
                return sum(1 for line in f)
        except Exception as e:
            print(f"获取 {file_path} 行数失败: {str(e)}")
            return 0

    def process_files(self, search_str):
        """
        完整处理流程：查找包含指定字符串的文件 -> 拷贝到目标目录(重命名) -> 根据行数休眠
        :param search_str: 要查找的字符串
        """
        # 查找匹配的文件
        print(self.log_tag,'process_files param:',search_str)
        matched_files = self.find_files_with_string(search_str)
        
        if not matched_files:
            print("没有找到匹配的文件")
            return
        
        # 拷贝文件并按格式重命名
        copied_files = self.copy_files(matched_files)
        
        # 处理每个拷贝的文件，根据行数休眠
        for file_path in copied_files:
            line_count = self.get_line_count(file_path)
            if line_count > 0:
                print(f"文件 {file_path} 包含 {line_count} 行，将休眠 {line_count}/1000 秒...")
                time.sleep(line_count/1000)
            else:
                print(f"文件 {file_path} 行数为0，无需休眠")

if __name__ == "__main__":
    # 设置命令行参数解析
    parser = argparse.ArgumentParser(description='查找包含特定字符串的文件并处理')
    parser.add_argument('--source', 
                       default='/home/cys/www/data/184.168.29.103/AnySelectedNew/', 
                       help='源目录路径')
    parser.add_argument('--target', default='/home/cys/www/data_vector_supplement/', help='目标目录路径')
    parser.add_argument('--search', required=True, help='要查找的字符串')
    
    # 解析命令行参数
    args = parser.parse_args()
    print("FileProcessor source:" + args.source + " target:" + args.target + " search:" + args.search) 
    try:
        # 创建处理器实例并执行处理
        processor = FileProcessor(args.source, args.target)
        processor.process_files(args.search)
    except ValueError as e:
        print(f"错误: {str(e)}")
    except Exception as e:
        print(f"处理过程中发生错误: {str(e)}")

